package com.ying.user.service.impl;

import com.ying.common.entity.Response;
import com.ying.user.service.MonitorService;
import com.ying.user.utils.RedisUtils;
import com.ying.user.utils.SecurityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class MonitorServiceImpl implements MonitorService {

    private static final Logger logger = LoggerFactory.getLogger(MonitorServiceImpl.class);
    // JWT 在 Redis 中保存的key前缀
    private static final String REDIS_JWT_KEY_PREFIX = "security:jwt:";
    // 星号
    String SYMBOL_STAR = "*";
    @Autowired
    private RedisUtils redisUtils;

    @Override
    public Response onlineUser(Integer pageNum, Integer pageSize) {
//        redisUtil.findKeysForPage(REDIS_JWT_KEY_PREFIX + SYMBOL_STAR, pageNum, pageSize);
//        List<String> rows = keys.getRows();
//        Long total = keys.getTotal();
//
//        // 根据 redis 中键获取用户名列表
//        List<String> usernameList = rows.stream()
//                .map(s -> StrUtil.subAfter(s, REDIS_JWT_KEY_PREFIX, true))
//                .collect(Collectors.toList());
//        // 根据用户名查询用户信息
//        List<User> userList = userDao.findByUsernameIn(usernameList);
//
//        // 封装在线用户信息
//        List<OnlineUser> onlineUserList = Lists.newArrayList();
//        userList.forEach(user -> onlineUserList.add(OnlineUser.create(user)));
//
//        return new PageResult<>(onlineUserList, total);
        return new Response().success();
    }

    @Override
    public void kickOut(List<String> names) {
        // 清除 Redis 中的 JWT 信息
        List<String> redisKeys = names.parallelStream()
                .map(s -> REDIS_JWT_KEY_PREFIX + s)
                .collect(Collectors.toList());
        redisUtils.delete(redisKeys);

        // 获取当前用户名
        String currentUsername = SecurityUtils.getCurrentUsername();
        names.parallelStream()
                .forEach(name -> {
                    // TODO: 通知被踢出的用户已被当前登录用户踢出，
                    //  后期考虑使用 websocket 实现，具体伪代码实现如下。
                    //  String message = "您已被用户【" + currentUsername + "】手动下线！";
                    logger.debug("用户【{}】被用户【{}】手动下线！", name, currentUsername);
                });
    }
}
